//生产者消费者模型
#include"BlockQueue.hpp"
#include"Task.hpp"


#include<pthread.h>
#include<unistd.h>
#include<ctime>
#include <stdlib.h>

int myAdd(int x,int y )
{
    return x+y;
}


void*productor(void*args)  //生产者
{
    BlockQueue<Task>*bqueue=(BlockQueue<Task>*)args;
    while(1)
    {
        int x=rand()%10+1;
        usleep(rand()%1000);
        int y =rand()%5+1;
        Task t(x,y,myAdd);
        bqueue->push(t);
        std::cout <<pthread_self() <<" productor: "<< t.x_ << "+" << t.y_ << "=?" << std::endl;
        sleep(1);
    }
    return nullptr;
}


void*consumer(void*args)  //消费者
{
    BlockQueue<Task>*bqueue=(BlockQueue<Task>*)args;
    while(1)
    {
        //获取任务
        Task t;
        bqueue->pop(&t);
        //完成任务
        cout<<pthread_self()<<"consumer:"<<t.x_<<"+"<<t.y_<<"="<<t()<<endl;
        sleep(1);
    }

    return nullptr;
}




int main()
{
    srand((uint64_t)time(nullptr) ^ getpid() ^ 0x32457); //种一个随机数种子
    BlockQueue<Task>*bqueue=new BlockQueue<Task>();  //y用于存放任务的循环队列

    pthread_t c[2],p[2]; //消费者线程 和 生产者线程
    pthread_create(c,nullptr,consumer,bqueue);
    pthread_create(c+1,nullptr,consumer,bqueue);
    pthread_create(p,nullptr,productor,bqueue);
    pthread_create(p+1,nullptr,productor,bqueue);

    pthread_join(c[0],nullptr);
    pthread_join(c[1],nullptr);
    pthread_join(p[0],nullptr);
    pthread_join(p[1],nullptr);

    delete bqueue;
    return 0;
}